package com.tony.juc;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created with IntelliJ IDEA.
 *
 * @Title: ConditionDemo001
 * @Auther: 皮蛋布丁
 * @Date: 2022/04/09/22:27
 * @Description: 等待唤醒
 */
public class ConditionDemo001 {
    public static String msg = null; // 保存信息

    public static void main(String[] args) throws Exception {
        Lock lock = new ReentrantLock(); // 获取一个互斥锁
        Condition condition = lock.newCondition(); // 获取Condition接口实例
        try {
            lock.lock(); // 锁定主线程，Condition是由Lock实现的，而await()等待异常，如果要将等待加入到AQS中，需要设置此处大环境
            new Thread(() -> {    // 创建子线程，修改msg的属性内容(内置的匿名内部类)
                lock.lock(); // 锁定子线程
                try {
                    System.out.printf("【%s】准备进行数据的处理操作%n", Thread.currentThread().getName());
                    TimeUnit.SECONDS.sleep(2); // 模拟数据修改的操作延迟
                    msg = "皮蛋布丁"; // 修改数据内容
                    condition.signal(); // 唤醒第一个等待的线程
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }, "子线程").start();
            condition.await(); // 主线程等待
            System.out.println("【主线程】得到最终处理的结果：" + msg);
        } catch (Exception e) {
            lock.unlock();
        }
    }
}
